#include"../inc/2048.h"
#include"../inc/2048_fuction.h"
unsigned char bmpdata[LCD_SIZE] ;
const char * bmpfiles[] =	
{
    "./pic/military_font_7_2.bmp",
	"./pic/military_font_7_4.bmp", 	//4
	"./pic/military_font_7_8.bmp", 	//8
	"./pic/military_font_7_16.bmp",	//16
	"./pic/military_font_7_32.bmp",
	"./pic/military_font_7_64.bmp",
	"./pic/military_font_7_128.bmp",
	"./pic/military_font_7_256.bmp",
	"./pic/military_font_7_512.bmp",
	"./pic/military_font_7_1024.bmp",
	"./pic/military_font_7_2048.bmp",
	"./pic/military_font_7_4096.bmp",
	"./pic/military_font_7_8192.bmp",
	"./pic/military_font_7_16384.bmp",
	"./pic/military_font_7_32768.bmp",
	"./pic/military_font_7_65536.bmp",
};
int *plcd=NULL;

int matrix[BOARDSIZE][BOARDSIZE]={0};

int game_over=0;
//���ļ�����bmp��ع��ܺ���

//����Ҫ��ʾ�����ַ����ļ����±�
/*
    ����ΪҪ��ʾ������,����ֵΪ��Ӧ����ͼƬ������
    ��Ҫ��ʾ������Ӧ2���ݴΣ������ݴμ�һ
    16��Ӧ3��2��Ӧ0 4��Ӧ1 8��Ӧ2 
*/
int get_bmpfiles_index(int x)
{
    if(x == 2)
    {
        return 0;
    } else if (x ==4)
    {
        return 1;
    } else if (x == 8)
    {
        return 2;
    }else if (x == 16)
    {
        return 3;
    }else if (x == 32)
    {
        return 4;
    }else if (x == 64)
    {
        return 5;
    }else if (x == 128)
    {
        return 6;
    }else if (x == 256)
    {
        return 7;
    }else if (x == 512)
    {
        return 8;
    }else if (x == 1024)
    {
        return 9;
    }else if (x == 2048)
    {
        return 10;
    }

}
/*
    ��������LcdDrawPoint����
    ���ܣ���ָ����ɫд��ָ�����ص�
    ������x��ָ�����ص��x����
    y��ָ�����ص��y����
    color��ָ����ɫ
*/
void LcdDrawPoint(int x,int y,unsigned int color)
{
    //plcd��ȫ�ֱ������洢��ʾ���ļ�ӳ�����
    int * p = plcd;
    //һ��ָ�벻����p[y][x]�ĸ�ʽ
    if(x>=0 && x<LCD_WIDTH && y>=0 &&y<LCD_HEIGHT)
    {
        *(p+x+y*LCD_WIDTH)=color;
    }
    //�����Ĳ��ֲ�����
}

//���ܣ�ͨ��bmpͼƬ�ļ�������Ļ�ϻ�����
//����:x,yΪ��ʾͼƬ��������꣬w��hΪͼƬ���Ⱥ͸߶ȣ�bmpnameΪͼƬ����
// void drawBmpByname(const char *bmpName,int x0,int y0,int w,int h)
// {
//     //���ļ�ͷ��ʼ��
//     FILE* fn= fopen(bmpName,"r+");
//     //��bmpͼƬ��Ϣ����bmpdata��
//     fseek(fn,54,SEEK_SET);
//     int readRevread=fread(bmpdata,1,w*h*3,fn);
//     if(readRevread != w*h*3)
//     {
//         if(ferror(fn))
//         {
//         perror("open bmpfile fail");
//          fclose(fn);  
//         return ;
//         }
//     }
//     //����д����㽫ͼƬ��Ϣд����Ļ
//     int x =0 ;int y = 0;
//     int i =0;//��¼�ߵ����ֽ���
//     /*�����������ص�*/
//         unsigned char b; 
//         unsigned char g; 
//         unsigned char r; 
//         int color;
//     for (y = 0;  y< h; y++)
//     {
       
//        for (x  = 0; x <w ; x++)
//        {
//             //��bmp�е�bgr����rgbд����ʾ��
//             b=bmpdata[i++];
//             g=bmpdata[i++];
//             r=bmpdata[i++];
//             color = (r<<16)|(g<<8)|b; 
//             //x�������Ƭ���ĺ����꣬y�������ꡣx0��y0����Ƭ�������ꡣ����ʾ�����������x+x0
//             //y���꣬h-1Ϊ�ӣ�0��0����ͼƬ�����������ֵ��(h-1-y)�ͱ����������ص����������Ӧ��bmpͼƬ���ص��������ǵ��ŵġ�+y0Ϊ����
//             LcdDrawPoint(x0+x,h-1-y+y0,color);
//        }
       
//     }   
//     //�ر�bmp�ļ�
//     fclose(fn);    
// }
void drawBmpByname(const char *bmpfile, int x0, int y0, int w, int h)
{
	int fd;
	int x, y;
	
	fd = open(bmpfile, O_RDONLY);
	if (fd == -1)
	{
		perror("open bmpfile error:");
		return ;
	}
		
	lseek(fd, 54, SEEK_SET);
	
	read(fd, bmpdata, w*h*3);

	close(fd);

	int i = 0;
	for (y = 0; y < h; y++)
	{
		unsigned char r,g ,b;
		int color;

		for (x = 0; x < w; x++)
		{
			b = bmpdata[i++];
			g = bmpdata[i++];
			r = bmpdata[i++];
			color = (r << 16) | (g << 8) | b;

			 LcdDrawPoint(x0+ x, y0 + (h -1 - y) ,color);
		}
	}

}
/*
    ��ʾһ�����β������ɫ
    ������LcdDrawRect
    ������x0��y0��ʾ���ε����
    w��h���εĿ��͸�
    color������������ɫ   
*/
void LcdDrawRect(int x0,int y0,int w,int h,unsigned int color)
{
    if(x0+w > LCD_WIDTH || y0 +h>LCD_HEIGHT || w<=0|| h<=0)
    {
        printf("rect size no rule");
        return ;
    }
    int x=0 ;
    int y=0;
     for(y = y0;y< h+y0;y++)
     {
        for ( x = x0; x < w+x0; x++)
        {
            //x��y����Ҫд����ɫ������
            LcdDrawPoint(x,y,color);
        }
     }
}
/*��ʾ����*/
void DrawMatrix()
{
    int x,y;
    int x0=100;//400+30+100<800
    int y0=20;//��ʼ����
    //�м������Ϊ10��10*3+100*4=430����ʼ���������Ϊ50
    for(y=0;y<BOARDSIZE;y++)
    {
        for(x=0;x<BOARDSIZE;x++)
        {
            if(matrix[y][x] == 0)
            {   
                //������ӵ�������0����ô�������ɫ����ʾ����,����Ϊ���ͺ������������ӳߴ�
                //�û����εķ�ʽ��һ��ȫ����ɫ�����ӳ���
                //10Ϊ�м��
                LcdDrawRect(x0+x*(PIECE_SIZE+10),y0+y*(PIECE_SIZE+10),PIECE_SIZE,PIECE_SIZE,0x0000ff);
            }
            else
            {
                //�õ����ֶ�Ӧ������ͼƬ�ļ�·������������,�����ֶ�Ӧ��bpmflies������
                int getIndex=get_bmpfiles_index(matrix[y][x]);
                //�ļ�·������ͼƬ����ʼ����
                drawBmpByname(bmpfiles[getIndex],x0+x*110,y0+y*110,PIECE_SIZE,PIECE_SIZE);
            }

        }
    }
}


